

# 定义允许的路径前缀列表（必须为绝对路径）,广告必需在这些路径下，以保护其余文件安全
ALLOWED_PREFIXES=(
    "/data/user/"
    "/data/data/"
    "/data/local/tmp"
    "/storage/emulated/"
    "/sdcard/"
    "/data/media/"
)


# 1. 检测文件夹或文件是否存在
# 参数：$1 为待检测的路径（文件或文件夹）
# 返回：0（存在）、1（不存在）、2（参数错误）
check_exists() {
    local path="$1"
    if [ -z "$path" ]; then
        echo "错误：check_exists 需提供待检测的路径"
        return 2
    fi
    if [ -e "$path" ]; then
        echo "路径存在：$path"
        return 0
    else
        echo "路径不存在：$path"
        return 1
    fi
}


# 2. 删除文件夹或文件（强制删除，无需确认）
# 参数：$1 为待删除的路径（文件或文件夹）
delete_path() {
    local path="$1"
    if [ -z "$path" ]; then
        echo "错误：delete_path 需提供待删除的路径"
        return 2
    fi
    if check_exists "$path"; then
        rm -rf "$path"
        if [ $? -eq 0 ]; then
            echo "已删除：$path"
            return 0
        else
            echo "错误：删除 $path 失败"
            return 1
        fi
    else
        echo "$path 不存在，无需删除"
        return 0
    fi
}


# 3. 创建一个文件（若父目录不存在会失败，需确保父目录存在）
# 参数：$1 为待创建的文件路径
create_file() {
    local file_path="$1"
    if [ -z "$file_path" ]; then
        echo "错误：create_file 需提供待创建的文件路径"
        return 2
    fi
    if check_exists "$file_path"; then
        echo "$file_path 已存在，无需创建"
        return 0
    fi
    touch "$file_path"
    if [ $? -eq 0 ]; then
        echo "已创建文件：$file_path"
        return 0
    else
        echo "错误：创建文件 $file_path 失败（可能父目录不存在）"
        return 1
    fi
}


# 4. 给文件设置权限为 000（无任何权限）
# 参数：$1 为目标文件路径
set_permission_000() {
    local file_path="$1"
    if [ -z "$file_path" ]; then
        echo "错误：set_permission_000 需提供目标文件路径"
        return 2
    fi
    if ! check_exists "$file_path"; then
        echo "错误：文件 $file_path 不存在，无法设置权限"
        return 1
    fi
    chmod 000 "$file_path"
    if [ $? -eq 0 ]; then
        echo "已设置 $file_path 权限为 000"
        return 0
    else
        echo "错误：设置 $file_path 权限失败"
        return 1
    fi
}


# 5. 设置文件所属用户为 root:root（需要 root 权限）
# 参数：$1 为目标路径（文件或文件夹）
set_owner_root() {
    local path="$1"
    if [ -z "$path" ]; then
        echo "错误：set_owner_root 需提供目标路径"
        return 2
    fi
    if ! check_exists "$path"; then
        echo "错误：路径 $path 不存在，无法设置所有者"
        return 1
    fi
    if [ "$(id -u)" -ne 0 ]; then
        echo "警告：非 root 用户，设置 root:root 可能失败（需 sudo 权限）"
    fi
    chown root:root "$path"
    if [ $? -eq 0 ]; then
        echo "已设置 $path 所有者为 root:root"
        return 0
    else
        echo "错误：设置 $path 所有者失败（可能需要 root 权限）"
        return 1
    fi
}


# 6. 新增：检查路径是否以允许的前缀开头（绝对路径校验）
# 参数：$1 为待检查的路径（文件或文件夹）
# 返回：0（符合规则）、1（不符合规则）、2（参数错误）
check_path_prefix() {
    local path="$1"
    if [ -z "$path" ]; then
        echo "错误：check_path_prefix 需提供待检查的路径"
        return 2
    fi

    # 将路径转换为绝对路径（处理相对路径情况）
    local abs_path
    if [[ "$path" = /* ]]; then
        abs_path="$path"  # 已是绝对路径
    else
        # 转换为绝对路径（兼容无realpath的环境）
        abs_path="$(cd "$(dirname "$path")" && pwd)/$(basename "$path")"
    fi

    # 检查是否匹配任何允许的前缀
    local is_allowed=0
    for prefix in "${ALLOWED_PREFIXES[@]}"; do
        if [[ "$abs_path" == "$prefix"* ]]; then
            is_allowed=1
            break
        fi
    done

    if [ $is_allowed -eq 1 ]; then
        echo "路径符合规则：$abs_path（前缀在允许列表中）"
        return 0
    else
        echo "错误：路径不符合规则！$abs_path 需以以下前缀开头："
        printf '  - %s\n' "${ALLOWED_PREFIXES[@]}"
        return 1
    fi
}

# 新增：检查文件是否已处理（权限000且所有者root:root）
# 返回：0（已处理）、1（未处理）、2（参数错误）、3（文件不存在）
check_already_processed() {
    cap_path="$1"  # cap: check_already_processed
    if [ -z "$cap_path" ]; then
        echo "错误：check_already_processed 需提供文件路径"
        return 2
    fi

    # 先检查文件是否存在
    if ! check_exists "$cap_path"; then
        echo "文件 $cap_path 不存在，未处理"
        return 3
    fi

    # 检查权限是否为000（兼容安卓stat命令，若stat不可用则用ls解析）
    cap_perm=""
    if command -v stat >/dev/null 2>&1; then
        # 用stat获取权限数字（安卓部分设备支持）
        cap_perm=$(stat -c %a "$cap_path" 2>/dev/null || stat --format %a "$cap_path" 2>/dev/null)
    else
        # 用ls -l解析权限（纯POSIX兼容方式）
        # ls -l输出格式：-rwxrwxrwx ...，取前10字符解析为数字
        cap_ls_output=$(ls -l "$cap_path" 2>/dev/null | head -n1)
        cap_perm_str=$(echo "$cap_ls_output" | awk '{print $1}')  # 权限字符串（如----------）
        # 转换权限字符串为数字（000对应----------）
        if [ "$cap_perm_str" = "----------" ]; then
            cap_perm="000"
        else
            cap_perm="not000"  # 非000权限
        fi
    fi

    # 验证权限是否为000
    if [ "$cap_perm" != "000" ]; then
        echo "文件 $cap_path 权限不是000（当前：$cap_perm），未处理"
        return 1
    fi

    # 检查所有者是否为root:root
    cap_owner=""
    if command -v stat >/dev/null 2>&1; then
        # 用stat获取所有者（用户:组）
        cap_owner=$(stat -c %U:%G "$cap_path" 2>/dev/null || stat --format %U:%G "$cap_path" 2>/dev/null)
    else
        # 用ls -l解析所有者（第3、4字段）
        cap_owner=$(ls -l "$cap_path" 2>/dev/null | head -n1 | awk '{print $3 ":" $4}')
    fi

    # 验证所有者
    if [ "$cap_owner" != "root:root" ]; then
        echo "文件 $cap_path 所有者不是root:root（当前：$cap_owner），未处理"
        return 1
    fi

    # 所有条件满足，已处理
    echo "文件 $cap_path 已处理（权限000且所有者root:root）"
    return 0
}


# 7. 组合操作：先校验路径规则，再执行 存在→删除→创建→设权限→设所有者
# 参数：$1 为目标文件路径（最终要创建的文件）
create_with_cleanup() {
    local target_file="$1"
    if [ -z "$target_file" ]; then
        echo "错误：create_with_cleanup 需提供目标文件路径"
        return 2
    fi

    echo "=== 开始组合操作：$target_file ==="
    
    # 新增：先检查是否已处理，已处理则直接返回
    if check_already_processed "$target_file"; then
        echo "组合操作跳过：$target_file 已处理"
        return 0
    fi

    # 第一步：先检查路径是否符合前缀规则（不符合则终止）
    if ! check_path_prefix "$target_file"; then
        echo "组合操作终止：路径不符合规则"
        return 1
    fi

    # 第二步：检测是否存在，若存在则删除
    if check_exists "$target_file"; then
        delete_path "$target_file" || {
            echo "组合操作失败：删除 $target_file 失败"
            return 1
        }
    fi

    # 第三步：创建文件
    create_file "$target_file" || {
        echo "组合操作失败：创建 $target_file 失败"
        return 1
    }

    # 第四步：设置权限为 000
    set_permission_000 "$target_file" || {
        echo "组合操作失败：设置 $target_file 权限失败"
        return 1
    }

    # 第五步：设置所有者为 root:root
    set_owner_root "$target_file" || {
        echo "组合操作失败：设置 $target_file 所有者失败"
        return 1
    }

    echo "=== 组合操作完成：$target_file ==="
    return 0
}


# 示例用法（取消注释后可测试，需 root 权限）
# check_path_prefix "/data/user/test.txt"   # 符合规则
# check_path_prefix "/tmp/test.txt"        # 不符合规则
# create_with_cleanup "/data/local/tmp/demo.txt"  # 符合规则，可执行
# create_with_cleanup "/home/test.txt"     # 不符合规则，会终止